package com.xinzhidi.web.equipment.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xinzhidi.web.equipment.domain.Equipment;
import com.xinzhidi.web.equipment.domain.dto.EquipmentDto;
import com.xinzhidi.web.equipment.domain.dto.EquipmentListDto;
import com.xinzhidi.web.equipment.domain.po.EquipmentPo;
import com.xinzhidi.web.equipment.domain.vo.EquipmentInfoVo;
import com.xinzhidi.web.equipment.domain.vo.EquipmentListVo;
import com.xinzhidi.web.equipment.domain.vo.EquipmentTemperatureVo;
import com.xinzhidi.web.equipment.dto.EquipmentGroupInfoDto;
import com.xinzhidi.web.netty.entity.DeviceInstruction;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * 设备Mapper接口
 *
 * @author ruoyi
 * @date 2023-05-29
 */
public interface EquipmentMapper extends BaseMapper<Equipment> {
    /**
     * 查询设备
     *
     * @param id 设备主键
     * @return 设备
     */
    Equipment selectEquipmentById(Long id);

    /**
     * 查询设备列表
     *
     * @param equipment 设备
     * @return 设备集合
     */
    List<Equipment> selectEquipmentList(Equipment equipment);

    /**
     * 新增设备
     *
     * @param equipment 设备
     * @return 结果
     */
    int insertEquipment(Equipment equipment);

    /**
     * 修改设备
     *
     * @param equipment 设备
     * @return 结果
     */
    int updateEquipment(Equipment equipment);

    /**
     * 删除设备
     *
     * @param id 设备主键
     * @return 结果
     */
    int deleteEquipmentById(Long id);

    /**
     * 批量删除设备
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteEquipmentByIds(Long[] ids);

    /**
     * 查询设备列表
     *
     * @param dto         查询设备dto
     * @param userPlotIds 用户小区id集合
     * @return 设备
     */
    List<EquipmentListVo> selectEquipmentListVo(@Param("dto") EquipmentListDto dto, @Param("list") List<Long> userPlotIds);

    /**
     * 查询设备列表（不分页）
     *
     * @param dto 查询设备dto
     * @return 设备
     */
    List<EquipmentListVo> listEquipmentNoPage(@Param("dto") EquipmentDto dto);

    /**
     * 获取设备list
     *
     * @param equipmentPo 设备查询条件
     * @return 设备信息
     */
    List<EquipmentInfoVo> getEquipmentList(EquipmentPo equipmentPo);

    /**
     * 查询楼栋下的单元设备
     *
     * @param protocolType 协议类型
     * @param buildIds     楼栋id集合
     * @return 设备信息
     */
    List<EquipmentInfoVo> getUnitEquipmentList(@Param("buildIds") List<Long> buildIds, @Param("protocolType") String protocolType);

    /**
     * 查询单元下的用户户设备
     *
     * @param protocolType 协议类型
     * @param unitIds      单元id集合
     * @return 设备信息
     */
    List<EquipmentInfoVo> getHouseholdEquipmentList(@Param("unitIds") List<Long> unitIds, @Param("protocolType") String protocolType);

    /**
     * 通过不同维度id获取该维度下的设备  如：小区id、楼栋id等
     * 如果传的是小区id，则获取小区下的所有设备，包括楼栋设备、单元设备、住户设备。其他维度同理
     *
     * @param ids      维度id集合
     * @param source   来源（1：平衡调控  2：初始设置）   如果source不为空，说明是平台调控。是空说明是初始设置。平台调控获取设备的时候不包含维度的下级设备
     * @param dataType 维度类型 0：小区 1：楼栋 2：单元 3：住户
     * @return 设备信息
     */
    List<EquipmentInfoVo> getEquipmentListByDim(@Param("setType") String setType, @Param("dataType") String dataType, @Param("ids") List<Long> ids);

    List<EquipmentListVo> equipmentGroupInfo(EquipmentGroupInfoDto dto);


    List<DeviceInstruction> getReconnectAddress();

    /**
     * 获取室温采集器设备
     *
     * @param householdId 住户id
     * @return 室温采集器设备
     */
    EquipmentTemperatureVo getTemperatureEquipment(Long householdId);


    Integer getNoSendEquipmentNumber(@Param("field") String field , @Param("id") Long id, @Param("equipmentLevel") String equipmentLevel , @Param("protocolTypeList") List<String> protocolTypeList);
}
